package reflect;

import java.lang.reflect.Method;

/**
 * @author 老安
 * @data 2022/7/21 19:51
 * java反射机制
 * 反射是java中的动态机制,它允许我们在程序运行期间再确定对象的实例化,方法的调用,属性的操作等.
 * 使得程序的灵活度大大提升,但是同时也带来了更多的资源开销和较低的运行效率
 * 程序不能过度依赖反射机制
 */
public class ReflectDemo1 {
    public static void main(String[] args) {
        /*
        * Class类 类对象类
        * Class类的每一个实例用于表示JVM中加载的一个类,并且每个被JVM加载的类都有且只有一个Class类的实例.
        * 通过Class得知其关联的类的一切信息:类名,包名,有哪些的构造器,方法属性等等.并且运行期间获取这些内容并进行相关操作.
        * 因此反射操作的第一步就是获取要操作的类的Class类对象.获取一个类的Class对象的方式:
        * 1:类名.class
        *   例如:
        *       Class cls = String.class;
        *       Class cls = int.class;
        * 2:Class.forName(String className)
        *   例如:
        *       Class cls = Class.forName("java.lang.String");
        * */
        Class cls = String.class;//获取String类对象
        //通过类对象获取其表示的String的相关信息
        String name = cls.getName();
        System.out.println("String的包类名:"+name);
        name = cls.getSimpleName();//Simple 简单
        System.out.println("String的类名:"+name);
        name = cls.getPackage().getName();
        System.out.println("String的包名:"+name);
        //Method 是方法对象
        //获取当前cls所表示的类的所有的公开方法(包含从超类中继承的方法)
        Method[] methods = cls.getMethods();
        System.out.println("String中的公开方法有:"+methods.length+"个");
        for (Method method : methods) {
            //获取方法名
            System.out.println("公开方法:"+method.getName());
        }
        System.out.println("================================================");
        //获取cls所表示的类的所有的类自身定义的方法(包含私有方法,不包含继承的方法)
        methods = cls.getDeclaredMethods();
        System.out.println("String中的方法有:"+methods.length+"个");
        for (Method method : methods) {
            //获取方法名
            System.out.println("方法:"+method.getName());
        }
    }
}
